import TokenManager from "./TokenManager";

// 用户信息接口
export interface UserInfo {
  uuid: string;
  email: string;
  nickname: string;
  avatar: string | null;
  status: number;
}

// 用户服务类
class UserService {
  private static readonly USER_INFO_KEY = "user_info";

  private _userInfo: UserInfo | null = null;

  // 订阅者模式: 存储状态变化时的回调函数
  private listeners: (() => void)[] = [];

  constructor() {
    this.loadFromStorage();
  }

  // 从本地存储加载用户状态
  private loadFromStorage(): void {
    try {
      const userInfoStr = localStorage.getItem(UserService.USER_INFO_KEY);
      if (userInfoStr) {
        this._userInfo = JSON.parse(userInfoStr);
      }
    } catch (error) {
      console.error("加载用户信息失败:", error);
    }
  }

  // 获取用户信息
  get userInfo(): UserInfo | null {
    return this._userInfo;
  }

  // 获取授权token
  get token(): string | null {
    return TokenManager.getToken();
  }

  // 获取刷新token
  get refreshToken(): string | null {
    return TokenManager.getRefreshToken();
  }

  // 判断用户是否已登录
  get isLoggedIn(): boolean {
    return !!this.token && !!this._userInfo;
  }

  // 设置用户信息并持久化
  setUserInfo(userInfo: UserInfo): void {
    console.log("[UserService] 设置用户信息:", userInfo);
    this._userInfo = userInfo;
    localStorage.setItem(UserService.USER_INFO_KEY, JSON.stringify(userInfo));
    this.notifyListeners();
  }

  // 设置授权token并持久化
  setToken(token: string): void {
    console.log("[UserService] 设置token:", token);
    TokenManager.setToken(token);
    this.notifyListeners();
  }

  // 设置刷新token并持久化
  setRefreshToken(refreshToken: string): void {
    console.log("[UserService] 设置refreshToken");
    TokenManager.setRefreshToken(refreshToken);
  }

  // 登出
  logout(): void {
    this._userInfo = null;
    TokenManager.clearAllTokens();
    localStorage.removeItem(UserService.USER_INFO_KEY);

    // 通知订阅者状态变化
    this.notifyListeners();
  }

  // 订阅状态变化
  subscribe(listener: () => void): () => void {
    this.listeners.push(listener);

    // 返回取消订阅的函数
    return () => {
      this.listeners = this.listeners.filter((l) => l !== listener);
    };
  }

  // 通知所有订阅者
  private notifyListeners(): void {
    console.log("[UserService] 通知订阅者, 数量:", this.listeners.length);
    this.listeners.forEach((listener) => listener());
  }

  // 添加一个公共方法来触发状态更新通知
  refreshState(): void {
    console.log("[UserService] 手动刷新状态");
    this.notifyListeners();
  }
}

// 创建单例
const userService = new UserService();

export default userService;
